Fix GtkEntry drawing to provide visual feedback when editable=FALSE.
authorDavid Trowbridge <trowbrds@gmail.com>
Mon, 19 Aug 2013 17:41:39 +0000 (13:41 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 19 Aug 2013 17:41:39 +0000 (13:41 -0400)
GtkEntry currently draws exactly the same no matter what the state of the
'editable' property. This is pretty confusing for users because there's
no visual feedback at all, it just seems like their keyboard is broken.

This change adds a "read-only" class to the StyleContext, which will
continue to allow the user to select/copy the text, but will draw the
entry as if it were insensitive, providing some indication that the
contents can't be changed.

Signed-off-by: David Trowbridge <trowbrds@gmail.com>
http://bugzilla.gnome.org/show_bug.cgi?id=694831

gtk/gtk-default.css
gtk/gtkentry.c
gtk/gtkstylecontext.h

index b125cf68e2a65039887546a8d2067b0269f6d59a..5f5f65188c66352e42009b605853c0533638a1b1 100644 (file)
@@ -54,6 +54,11 @@ GtkTreeView.dnd {
   color: shade (@bg_color, 0.7);
 }
 
+.entry.read-only {
+  border-color: shade (@bg_color, 0.7);
+  background-color: shade (@bg_color, 0.9);
+}
+
 .entry:selected {
   background-color: shade (@bg_color, 0.9);
   color: @fg_color;
index 76bb87409d52bf2cff9cea674329713260b2124a..8c32bd07f195040756079fb18c728be3f44a2594 100644 (file)
@@ -2054,6 +2054,7 @@ gtk_entry_set_property (GObject         *object,
     case PROP_EDITABLE:
       {
         gboolean new_value = g_value_get_boolean (value);
+        GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (entry));
 
         if (new_value != priv->editable)
          {
@@ -2067,7 +2068,13 @@ gtk_entry_set_property (GObject         *object,
 
                priv->preedit_length = 0;
                priv->preedit_cursor = 0;
+
+                gtk_style_context_remove_class (context, GTK_STYLE_CLASS_READ_ONLY);
              }
+            else
+              {
+                gtk_style_context_add_class (context, GTK_STYLE_CLASS_READ_ONLY);
+              }
 
            priv->editable = new_value;
 
@@ -3705,7 +3712,7 @@ gtk_entry_draw_frame (GtkWidget       *widget,
 
   if (priv->has_frame)
     gtk_render_frame (context, cr,
-                      x, y, width, height);
+                     x, y, width, height);
 
   gtk_entry_draw_progress (widget, context, cr);
 
index 729613c0368b0259e5264be302b70e9286f6437b..29f3ebfab88217d3bb05d0a47eaeb396c6e00657 100644 (file)
@@ -923,6 +923,12 @@ void           gtk_style_context_set_frame_clock (GtkStyleContext *context,
 GDK_AVAILABLE_IN_3_8
 GdkFrameClock *gtk_style_context_get_frame_clock (GtkStyleContext *context);
 
+/**
+ * GTK_STYLE_CLASS_READ_ONLY:
+ *
+ * A CSS class used to indicate a read-only state.
+ */
+#define GTK_STYLE_CLASS_READ_ONLY "read-only"
 
 GDK_DEPRECATED_IN_3_8_FOR(gtk_style_context_set_state)
 void             gtk_style_context_set_direction (GtkStyleContext  *context,